#include <iostream>
#include <string>
#include "structures.h"
#include "ConstrArbre2.h"
#include "RechPO.h"
#include "compress.h"
#include <QApplication>

void compress(char* chaine, dico2* racine,char* nom, QProgressBar* bar){
/* La fonction prend en parametre une chaine et l'arbre des suffixes de cette chaine
elle compresse a partir de ces deux variables la chaine et enregistre dans un fichier que le programme creera 
la chaine compresse*/
unsigned int i = 0,l,s; // l est Li et s est Si la longueur du plus long préfixe présent après et s la position initial//le nom du fichier qu'on crée qui contiendra la chaine compresse
FILE* CompressFile=NULL;
unsigned int pourcent=0;
//strcat(nom,".dicosu");//on effectue une concaténation
CompressFile = fopen(nom, "w+");//on cree le fichier
fprintf(CompressFile,"%ld\n",strlen(chaine)+1);//on indique dans le fichier la taille de la vrai chaine
do{
	if((i*100)/strlen(chaine)!=pourcent)
	{
		//system("clear");
		pourcent=(i*100)/strlen(chaine);
		bar->setValue(pourcent);
			bar->repaint();
			bar->update();
			bar->update();
			bar->update();
			QApplication::processEvents();
		//printf("\n[ %d%% ]",pourcent);
	}
	rech(&l,&s,i,racine,chaine);//on fait les recherches des prefixes



if(l>0)
{
	
	fprintf(CompressFile," %d %d ",s,l);//on cree le couple de chiffre
	i=i+l;
}
else
{
	
	fprintf(CompressFile,"%c",chaine[i]);//on insere le caractere

	i++;
}
}while(chaine[i-1]!='$');





fclose(CompressFile);

}
char* decompress(FILE* fichier){
/*cette fonction prend en parametre un fichier compresse par l'algorithme de liv zempel qu'elle doit décompresser
en une chaine de caractere classique*/
char c;int i = 0,deb,taille2,taille;
	fscanf(fichier, "%d",&taille);
	char *genome=(char*)malloc((taille)*sizeof(char));
	//printf("la tailles est de \"%ld\"\n",taille);getchar();
do
{
	c = fgetc(fichier);
}while(c!='\n');
		do
		{
		
		c = fgetc(fichier);
		if(c=='a' || c=='t' || c == 'c' || c== 'g' || c=='$')
		{
			genome[i]=c;genome[i+1]='\0';//printf("%s",genome);//getchar();
			i++;
		}
		else if(c=='\n')
			c = fgetc(fichier);
		else
		{	//printf("%c",c);//getchar();getchar();
			fscanf(fichier, "%d %d",&deb,&taille2);fgetc(fichier);
			//printf(" %d %d ",deb, taille2);
			for(int j=deb-1;j<deb-1+taille2;j++)
			{
				genome[i+j-deb+1]=genome[j];genome[i+j-deb+2]='\0';
				
			};i=i+taille2;
		}

		}while(c!='$');
		
		fclose(fichier);
		return genome;
}

int rech(unsigned int *l,unsigned  int *s,unsigned int position,dico2* Racine,char* chaine)
{
/*Cette fonction prend en parametre une chaine, un indice dans cette chaine l'arbre ainsi que *l et*s qui seront les informations du prefixe
Elle a pour but de chercher le plus grand prefixe identique a la chaine qui commence au niveau de l'indice*/

	unsigned int j=0,aVinf=0,av=position;*l=0;
	while(av<strlen(chaine))
	{
		
		j=convert_car(chaine[av]);
		
		if((*Racine).fils[j]!=NULL && ((*(*Racine).fils[j]).DebutRacine-1 < position))
		{
			aVinf=(*(*Racine).fils[j]).debut-1;
			while(aVinf-(*(*Racine).fils[j]).debut+1<(*(*Racine).fils[j]).taille  && av<strlen(chaine)-1 && chaine[aVinf]==chaine[av])
			{
				aVinf++;av++;
			}
			*s=(*Racine).fils[j]->DebutRacine;
			*l=av-position;
			if ((*(*Racine).fils[j]).taille<=aVinf-(*(*Racine).fils[j]).debut+1 && *s+*l-1<position)
			{
			
			
			Racine=(*Racine).fils[j];
				
			}
			else 
			{
				if(*s+*l-1>position)
					*l=position-*s+1;
				
				 return 0;
			}
		}
		else
		{
		
			return 0;
		}
		
	}
	if(av>strlen(chaine))
	{
		*l=av-position;
		*s=Poccurence((*Racine).fils[j]);return 0;
	}
	else
		
	return 0;

}
void enregistre(char* chaine,char* nom)
{
/*cette fonction enregistre dans un fichier txt la chaine de caractere avec sur la premiere ligne
la taille et un retour a la ligne tous les 60 caracteres*/
	
	FILE* File=NULL;
	unsigned int i = 0;
	
	if(nom[strlen(chaine)-1]!='t' || nom[strlen(chaine)-2]!='x' || nom[strlen(chaine)-3]!='t' || nom[strlen(chaine)-4]!='.')
	
	File = fopen(nom, "w+");
	fprintf(File,"%ld",strlen(chaine)+1);
	while(chaine[i-1]!='$')
	{
		if(i%60==0)
		{
			fprintf(File,"\n");
		}
		fprintf(File,"%c",chaine[i]);
		i++;
	}
	fclose(File);
}
